package br.ufrgs.engsoft.rest;

import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.xml.bind.JAXBElement;

import br.ufrgs.engsoft.ejb.remote.ReferenciaEJBRemote;
import br.ufrgs.engsoft.entity.Referencia;

@Path("/Referencia")								// Define o caminho de publicacao
@Consumes({"application/xml", "application/json"})	// Define o padrao da entrada
@Produces({"application/xml", "application/json"})	// Define o padrao de retorno
public class ReferenciaResource {
	@Context
	private UriInfo uriInfo;	// Informacoes sobre o contexto da aplicacao
	
	@GET			// Responde requisicoes do tipo HTTP-GET sem parametro
	public List<Referencia> getAllReferencias() throws NamingException {
		ReferenciaEJBRemote referenciaEJB = (ReferenciaEJBRemote) new InitialContext()
											.lookup("java:global/PublicacaoWEB/ReferenciaEJB");
		return new ArrayList<Referencia>(referenciaEJB.listarReferencia());
	}
	
	@GET			// Responde requisicoes do tipo HTTP-GET
	@Path("{id}/")	// Define um parametro ao url (polimorfismo atraves de parametro)
	public List<Referencia> getReferenciasByAutor(@PathParam("id") Integer idAutor ) throws NamingException {
		// Obtendo o ReferenciaEJB
		ReferenciaEJBRemote referenciaEJB = (ReferenciaEJBRemote) new InitialContext()
											.lookup("java:global/PublicacaoWEB/ReferenciaEJB");
		// Executando a consulta de referencias por autor
		Collection<Referencia> referencias = referenciaEJB.listarReferenciaPorAutor(idAutor);
		return new ArrayList<Referencia>(referencias); // Retornando os resultados
	}
	
	@POST
	public Response createNewReferencia(JAXBElement<Referencia> referenciaJaxb) throws NamingException {
		// Obtendo a entidade a partir de um JAXBElement (unbind)
		Referencia referencia = referenciaJaxb.getValue();
		// Obtendo o ReferenciaEJB
		ReferenciaEJBRemote referenciaEJB = (ReferenciaEJBRemote) new InitialContext()
											.lookup("java:global/PublicacaoWEB/ReferenciaEJB");
		// Executando a inclusao de referencia
		referenciaEJB.incluirReferencia(referencia);
		// Gerando a URI de resposta
		URI referenciaUri = uriInfo.getAbsolutePathBuilder().path(referencia.getId().toString()).build();
		return Response.created(referenciaUri).build(); // Retornando a URI de resposta
	}
}
